home *** CD-ROM | disk | FTP | other *** search
/ Aminet 23 / Aminet 23 (1998)(GTI - Schatztruhe)[!][Feb 1998].iso / Aminet / docs / lists / NAM1297.lha / NAM1297 / LON.LHA / LON.rexx < prev    next >
OS/2 REXX Batch file  |  1996-01-26  |  11KB  |  271 lines

  1. /* L(ast)ON $VER:1.9
  2. ** (c) 26-Jan-1996 Jostein Trondal. See readme-file for more info.
  3. */
  4.  
  5. r = 0; s = 0; f = 0; i=0; onlydots = 0; thismonth = 0; entrys = 0; sortmode = 0; width = 20; notime = 0
  6.  
  7. ARG line
  8. DO n=1 TO WORDS(line)
  9.   par.n = WORD(line,n)
  10. END
  11.  
  12. DO n = 1 TO 7
  13.   IF (UPPER(par.n) = 'P'  | UPPER(par.n) = 'PHONE')     THEN DO; pread     = 1; r = 1; END
  14.   IF (UPPER(par.n) = 'L'  | UPPER(par.n) = 'LOG')     THEN DO; pread     = 0; r = 1; END
  15.   IF (UPPER(par.n) = 'U'  | UPPER(par.n) = 'UPSORT')     THEN DO; sortmode  = 1; s = 1; END
  16.   IF (UPPER(par.n) = 'D'  | UPPER(par.n) = 'DOWNSORT')     THEN DO; sortmode  = 2; s = 1; END
  17.   IF (UPPER(par.n) = 'A'  | UPPER(par.n) = 'ALPHASORT')  THEN DO; sortmode  = 3; s = 1; END
  18.   IF (UPPER(par.n) = '-O' | UPPER(par.n) = '-ONLYDOTS')  THEN DO; onlydots  = 1;    END
  19.   IF (UPPER(par.n) = '-T' | UPPER(par.n) = '-THISMONTH') THEN DO; thismonth = 1;    END
  20.   IF (UPPER(par.n) = '-N' | UPPER(par.n) = '-NOTIME')     THEN DO; notime    = 1;    END
  21.   IF LEFT(UPPER(par.n),2,1) = '-W' THEN width = DELSTR(par.n,1,2)
  22.   IF LEFT(UPPER(par.n),2,1) = '-L' THEN DO; infile = DELSTR(par.n,1,2); pread = 0; r = 1; i = 1; END
  23.   IF LEFT(UPPER(par.n),2,1) = '-F' THEN DO; outfile = DELSTR(par.n,1,2);     f = 1; END
  24. END
  25.  
  26. IF ~r THEN DO
  27.   SAY "›32mLON v1.9   ›31m(c) 26-Jan-1996 Jostein Trondal   ›33;1mFreeware›0m"
  28.   SAY "Usage: Rx LON <P=Phone|[L=Log|-L<LogFile>]> [-T=ThisMonth] [-O=OnlyDots]"
  29.   SAY "              [U=UpSort|D=DownSort|A=AlphaSort] [-F<OutputFile>]"
  30.   SAY "              [-Wnn=NameWidth] [-N=NoTime]"
  31.   SAY ""
  32.   EXIT
  33. END
  34.  
  35. cd.1.wrd='Jan';cd.1.num='01';cd.2.wrd='Feb';cd.2.num='02';cd.3.wrd='Mar';cd.3.num='03';cd.4.wrd='Apr';cd.4.num='04'
  36. cd.5.wrd='May';cd.5.num='05';cd.6.wrd='Jun';cd.6.num='06';cd.7.wrd='Jul';cd.7.num='07';cd.8.wrd='Aug';cd.8.num='08'
  37. cd.9.wrd='Sep';cd.9.num='09';cd.10.wrd='Oct';cd.10.num='10';cd.11.wrd='Nov';cd.11.num='11';cd.12.wrd='Dec';cd.12.num='12'
  38.  
  39. IF f THEN DO    /* Open outputfile */
  40.   IF ~OPEN(out,outfile,'w') THEN DO
  41.     SAY 'Unable to open "'outfile'"'
  42.     EXIT
  43.   END
  44.   ELSE OPEN(out,outfile,'w')
  45. END
  46.  
  47. IF pread THEN DO
  48.   filename = 'NComm:Ncomm.phone'
  49.   IF OPEN(log,filename,'r') THEN DO
  50.     cal.1 = 2678400;  cal.2 = 2419200;  cal.3 = 2678400;  cal.4 = 2592000    /* Number of seconds */
  51.     cal.5 = 2678400;  cal.6 = 2592000;  cal.7 = 2678400;  cal.8 = 2678400    /* in every month of */
  52.     cal.9 = 2592000; cal.10 = 2678400; cal.11 = 2592000; cal.12 = 2678400     /* the year */
  53.     CALL SEEK(log,1,'c')    /* Skips the first unimportant byte of the file */
  54.     DO FOREVER
  55.       year = 1970; months = 1; days = 1; hours = 0; mins = 0; secs = 0
  56.       bufname = READCH(log,41)    /* Read the (next) BBS-Name */
  57.       IF EOF(log) THEN LEAVE
  58.       bufnr = READCH(log,61)    /* Read the phonenumber */
  59.       CALL SEEK(log,-61,'c')
  60.       skipthis = 0
  61.       IF onlydots THEN DO    /* IF-sentence checks '.' in phonebook-comment */
  62.     skipthis = 1
  63.     CALL SEEK(log,61,'c')
  64.     testdot = READCH(log,1)
  65.     IF testdot = '.' THEN DO
  66.       skipthis = 0
  67.       CALL SEEK(log,-62,'c')
  68.     END
  69.     ELSE CALL SEEK(log,239,'c')
  70.       END
  71.       IF ~skipthis then DO
  72.     CALL SEEK(log,239,'c')
  73.     bufdate = READCH(log,4)    /* Reads the date */
  74.     re = C2X(bufdate)
  75.     rest = X2D(re)
  76.     IF rest > 757382399 THEN rest = rest - 757382400    /* Skip to 1994 */
  77.     year = 1994
  78.     IF rest > 0 THEN DO
  79.       entrys = entrys + 1
  80.       list.entrys.bbsname = LEFT(bufname,INDEX(bufname,'00'x) - 1)
  81.       list.entrys.bbsnr = LEFT(bufnr,INDEX(bufnr,'00'x) - 1)
  82.       rest = rest - 21600    /* Remove 6 hours */
  83.       DO FOREVER
  84.         leap = 0        /* leap = boolean value if or if not leap year */
  85.         IF year // 4 = 0 THEN leap = 1    /* If year is dividable by 4 then year is a leap year */
  86.         IF year // 400 = 0 THEN leap = 0    /* If year is dividable by 400 then year is not a leap year */
  87.         IF leap THEN DO
  88.           IF rest >= 31622400 THEN rest = rest - 31622400
  89.           IF rest < 31622400 THEN LEAVE
  90.         END
  91.         IF ~leap THEN DO
  92.           IF rest >= 31536000 THEN rest = rest - 31536000
  93.           IF rest < 31536000 THEN LEAVE
  94.         END
  95.         year = year + 1
  96.       END
  97.       year = year + 1
  98.       leap = 0
  99.       IF year // 4 = 0 THEN leap = 1
  100.       IF year // 400 = 0 THEN leap = 0
  101.       IF leap THEN cal.2 = 2505600
  102.       IF ~leap THEN IF rest > 15638399 THEN DO; rest = rest - 15638400; months = months + 6; END
  103.            ELSE IF rest > 15724799 THEN DO; rest = rest - 15724800; months = months + 6; END
  104.       IF rest >= cal.1 THEN DO FOREVER
  105.         IF rest >= cal.months THEN DO    /* Bugfix in v1.5 */
  106.           rest = rest - cal.months
  107.           months = months + 1
  108.         END
  109.         IF rest < cal.months THEN LEAVE
  110.       END
  111.       IF rest > 86399 THEN DO FOREVER
  112.         IF rest > 86399 THEN DO    /* Bugfix in v1.5 */
  113.           rest = rest - 86400
  114.           days = days + 1
  115.         END
  116.         IF rest < 86400 THEN LEAVE
  117.       END
  118.       t = 2; CALL Timestuff(rest,hours,64799,64800,18,43199,43200,12,21599,21600,6,3599,3600)
  119.       t = 3; CALL Timestuff(rest,mins,2699,2700,45,1799,1800,30,899,900,15,59,60)
  120.       t = 4; CALL Timestuff(rest,secs,44,45,45,29,30,30,14,15,15,0,1)
  121.       IF months < 10 THEN months = 0''months
  122.       IF days   < 10 THEN days   = 0''days
  123.       IF hours  < 10 THEN hours  = 0''hours
  124.       IF mins   < 10 THEN mins   = 0''mins
  125.       IF secs   < 10 THEN secs   = 0''secs
  126.       list.entrys.ld = days'.'months'.'year'  'hours':'mins':'secs
  127.       IF thismonth THEN DO
  128.         done = 0
  129.         IF year ~= SUBSTR(DATE('s'),1,4) THEN DO; entrys = entrys - 1; done = 1; END
  130.         IF ~done THEN IF months ~= SUBSTR(DATE('s'),5,2) THEN entrys = entrys - 1
  131.       END
  132.     END
  133.     CALL SEEK(log,58,'c')
  134.       END
  135.     END
  136.   END
  137.   ELSE SAY 'Unable to open "'filename'"'
  138. END
  139.  
  140. IF ~pread THEN DO
  141.   filename = 'NComm:NComm.log'
  142.   IF i THEN filename = infile
  143.   IF OPEN(log,filename,'r') THEN DO
  144.     line = READLN(log)
  145.     IF SUBSTR(line,1,1) = '(' THEN list.1.bbsname = SUBSTR(line,1,POS(')',line))
  146.     ELSE list.1.bbsname = SUBSTR(line,1,POS(' (',line))
  147.     list.1.bbsnr = SUBSTR(line,POS('(',line)+1,POS(')',line)-POS('(',line)-1)
  148.     line = READLN(log); line = READLN(log)
  149.     CALL ExtractDate
  150.     list.1.ld = textdate
  151.     entrys = entrys + 1
  152.     IF thismonth THEN DO
  153.       done = 0
  154.       IF SUBSTR(textdate,7,4) ~= SUBSTR(DATE('s'),1,4) THEN DO; entrys = entrys - 1; done = 1; END
  155.       IF ~done THEN IF SUBSTR(textdate,4,2) ~= SUBSTR(DATE('s'),5,2) THEN entrys = entrys - 1
  156.     END
  157.     line = READLN(log); line = READLN(log); line = READLN(log)    /* Bugfix */
  158.     logbug = 0                            /*   in   */
  159.     IF C2X(LEFT(line,1)) ~= 20 THEN logbug = 1            /*  v1.5  */
  160.     DO FOREVER
  161.       IF ~logbug THEN line = READLN(log)
  162.       IF ~EOF(log) THEN DO
  163.     alike = 0
  164.     DO n = 1 to entrys
  165.       doit = 0
  166.       IF list.n.bbsname = SUBSTR(line,1,POS(' (',line)) THEN doit = 1
  167.       IF list.n.bbsname = SUBSTR(line,1,POS(')',line)) THEN doit = 1
  168.       IF doit THEN DO
  169.         list.n.bbsnr = SUBSTR(line,POS('(',line)+1,POS(')',line)-POS('(',line)-1)
  170.         line = READLN(log); line = READLN(log)
  171.         CALL ExtractDate
  172.         list.n.ld = textdate
  173.         line = READLN(log); line = READLN(log); line = READLN(log)    /* Bugfix */
  174.         logbug = 0                            /*   in   */
  175.         IF C2X(LEFT(line,1)) ~= 20 THEN logbug = 1            /*  v1.5  */
  176.         alike = 1
  177.       END
  178.     END
  179.     IF ~alike THEN DO
  180.       IF SUBSTR(line,1,1) = '(' THEN list.n.bbsname = SUBSTR(line,1,POS(')',line))
  181.       ELSE list.n.bbsname = SUBSTR(line,1,POS(' (',line))
  182.       list.n.bbsnr = SUBSTR(line,POS('(',line)+1,POS(')',line)-POS('(',line)-1)
  183.       line = READLN(log); line = READLN(log)
  184.       too = entrys + 1
  185.       CALL ExtractDate
  186.       list.too.ld = textdate
  187.       entrys = entrys + 1
  188.       IF thismonth THEN DO
  189.         done = 0
  190.         IF SUBSTR(textdate,7,4) ~= SUBSTR(DATE('s'),1,4) THEN DO; entrys = entrys - 1; done = 1; END
  191.         IF ~done THEN IF SUBSTR(textdate,4,2) ~= SUBSTR(DATE('s'),5,2) THEN entrys = entrys - 1
  192.       END
  193.       line = READLN(log); line = READLN(log); line = READLN(log)    /* Bugfix */
  194.       logbug = 0                            /*   in   */
  195.       IF C2X(LEFT(line,1)) ~= 20 THEN logbug = 1            /*  v1.5  */
  196.     END
  197.       END
  198.       IF EOF(log) THEN LEAVE
  199.     END
  200.     CLOSE(log)
  201.   END
  202.   ELSE SAY 'Unable to open "'filename'"'
  203. END
  204.  
  205. IF entrys = 0 THEN EXIT
  206.  
  207. IF width < 20 THEN width = 20
  208. IF width > 40 THEN width = 40
  209.  
  210. DO n = 1 TO entrys
  211.   IF LENGTH(list.n.bbsname) > width THEN list.n.bbsname = LEFT(list.n.bbsname,20)
  212.   DO (width + 1) - LENGTH(list.n.bbsname)    /* <-- bugfix in v1.2 */
  213.     list.n.bbsname = list.n.bbsname || ' '
  214.   END
  215. END
  216.  
  217. IF entrys > 1 & s = 1 THEN DO    /* Selectsort routine */
  218.   DO n = 1 TO entrys - 1
  219.     min = n
  220.     DO m = n + 1 TO entrys
  221.       IF sortmode = 1 THEN IF SUBSTR(list.m.ld,7,4)SUBSTR(list.m.ld,4,2)SUBSTR(list.m.ld,1,2)SUBSTR(list.m.ld,13,2)SUBSTR(list.m.ld,16,2)SUBSTR(list.m.ld,19,2)y < SUBSTR(list.min.ld,7,4)SUBSTR(list.min.ld,4,2)SUBSTR(list.min.ld,1,2)SUBSTR(list.min.ld,13,2)SUBSTR(list.min.ld,16,2)SUBSTR(list.min.ld,19,2)y THEN min = m
  222.       IF sortmode = 2 THEN IF SUBSTR(list.min.ld,7,4)SUBSTR(list.min.ld,4,2)SUBSTR(list.min.ld,1,2)SUBSTR(list.min.ld,13,2)SUBSTR(list.min.ld,16,2)SUBSTR(list.min.ld,19,2)y < SUBSTR(list.m.ld,7,4)SUBSTR(list.m.ld,4,2)SUBSTR(list.m.ld,1,2)SUBSTR(list.m.ld,13,2)SUBSTR(list.m.ld,16,2)SUBSTR(list.m.ld,19,2)y THEN min = m
  223.       IF sortmode = 3 THEN DO
  224.     IF UPPER(LEFT(list.m.bbsname,4))   = 'THE ' THEN; a = SUBSTR(list.m.bbsname,5,LENGTH(list.m.bbsname)-4); ELSE a = list.m.bbsname
  225.     IF UPPER(LEFT(list.min.bbsname,4)) = 'THE ' THEN; b = SUBSTR(list.min.bbsname,5,LENGTH(list.min.bbsname)-4); ELSE b = list.min.bbsname
  226.     IF UPPER(a) < UPPER(b) THEN min = m    /* <-- Bugfix in v1.9 */
  227.       END
  228.     END
  229.     buf = list.n.bbsname; list.n.bbsname = list.min.bbsname; list.min.bbsname = buf
  230.     buf = list.n.bbsnr;   list.n.bbsnr = list.min.bbsnr;     list.min.bbsnr = buf
  231.     buf = list.n.ld;      list.n.ld = list.min.ld;           list.min.ld = buf
  232.   END
  233. END
  234.  
  235. IF f THEN DO    /* Output to file */
  236.   DO n = 1 TO entrys
  237.     IF notime THEN list.n.ld = SUBSTR(list.n.ld,1,10)
  238.     WRITELN(out,list.n.bbsname list.n.ld || '  ' || list.n.bbsnr)
  239.   END
  240.   CLOSE(out)
  241. END
  242. ELSE DO n = 1 TO entrys    /* Output to screeen */
  243.   IF notime THEN list.n.ld = SUBSTR(list.n.ld,1,10)
  244.   SAY list.n.bbsname list.n.ld  || '  ' || list.n.bbsnr
  245. END
  246.  
  247. EXIT
  248.  
  249. Timestuff:
  250.   PARSE ARG rest, type, an1, an2, an3, bn1, bn2, bn3, cn1, cn2, cn3, dn1, dn2
  251.   IF t = 1 & rest < 604800 THEN type = type - 1        /* <-- Bugfix in v1.3 & v1.4 */
  252.   IF rest > an1 THEN DO; rest = rest - an2; type = type + an3; END
  253.   IF rest > bn1 THEN DO; rest = rest - bn2; type = type + bn3; END
  254.   IF rest > cn1 THEN DO; rest = rest - cn2; type = type + cn3; END
  255.   IF rest > dn1 THEN DO FOREVER
  256.     IF rest > dn1 THEN DO
  257.       rest = rest - dn2
  258.       type = type + 1
  259.     END
  260.     IF rest <= dn1 THEN LEAVE
  261.   END
  262.   IF t = 1 THEN days = type; IF t = 2 THEN hours = type
  263.   IF t = 3 THEN mins = type; IF t = 4 THEN secs = type
  264. RETURN
  265.  
  266. ExtractDate: /* Bugfixed in v1.7 */
  267.   DO y = 1 TO 12
  268.     IF SUBSTR(line,13,3) = cd.y.wrd THEN textdate = SUBSTR(line,17,2)'.'cd.y.num'.'SUBSTR(line,29,4) '' SUBSTR(line,20,8)
  269.   END
  270. RETURN
  271.